QEMU
QEMU(Quick Emulator)是一個開源的虛擬化工具,它可以在不同的硬體平台上運行虛擬機器(VM),而QEMU如同它名稱所表示的,實際上是一種仿真器(Emulator),不過因為QEMU也常常作為RISC-V使用者進行模擬的平台,且QEMU本身極快的特性讓他很適合當作模擬器建構過程中的輔助工具 (例如像Spike一樣作為標準答案,或者是作為產生儲存點(checkpoint)的工具都很適合),因此筆者也打算花一篇的內容來講QEMU要怎麼使用。
checkpoint在模擬器領域指的是透過儲存模擬器的暫態,在下次進行模擬時可以回存(restore)回該狀態,進而節省模擬時間
QEMU作為仿真器,其並沒有實際上去模擬處理器的行為,相反的,他透過DBT(dynamic binary translate)的技術,將目標(例如說RISC-V)的指令轉換成本機(例如說X86)的指令並執行,就像是系列文章前面提到的黑魔法一樣。因此其模擬速度相較一般的功能模擬器還要快上許多,以筆者之前的經驗約有1GIPS以上。而QEMU與Spike一樣有模擬機器本身的ROM Code,因此同樣的直接執行程式會遇到跳到0x80000000的問題。
sifive_u.c
...
..
uint32_t reset_vec[12] = {
s->msel, /* MSEL pin state */
0x00000297, /* 1: auipc t0, %pcrel_hi(fw_dyn) */
0x02c28613, /* addi a2, t0, %pcrel_lo(1b) */
0xf1402573, /* csrr a0, mhartid */
0,
0,
0x00028067, /* jr t0 */
start_addr, /* start: .dword */
start_addr_hi32,
fdt_load_addr, /* fdt_laddr: .dword */
0x00000000,
0x00000000,
/* fw_dyn: */
};
QEMU的安裝方法
QEMU本身可以直接透過apt-install下載,指令如下
apt install qemu qemu-kvm libvirt-bin bridge-utils cpu-checker virtinst
但如果本身機器太舊(例如筆者是ubuntu14-04),則會沒有risc-v的版本,要手動安裝,
安裝時可以參考risc-v-getting-started-guide內的這篇文章的內容,選擇v5.0版。
安裝步驟如下:
git clone https://github.com/qemu/qemu
git checkout v5.0.0
./configure --prefix="PATH/TO/INSTALL" --target-list=riscv64-softmmu
make -j $(nproc)
sudo make install
順利安裝後,由於Qemu本身並沒有像是Spike的PK那樣配套的kernel,因此可以選擇參考risc-v-getting-started-guide的內容直接將linux開起來。我們在此先將QEMU安裝好,作為將來自己的模擬器要開啟linux時的標準答案使用,因為我們的模擬器沒有MMU,而QEMU相較於Spike有額外提供no-mmu這個option,較適合我們所使用。
QEMU的一些技巧
在以QEMU作為"標準答案"時,我們可以找到設定option去倒QEMU的log (有哪些內容可以參考官方qemu-log.c)
例如我想要將exec的所有內容倒到文件"debug.log",直覺上會想要這樣下,
qemu-system-riscv64 -nographic -machine virt \
-kernel linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" \
-drive file=busybox,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 -D "debug.log" -d "exec"
但如果實際上去跟自己的模擬器或者是spike去比較,會發現qemu的指令數量壓倒性的少,且能觀察到PC會跳號,這是因為qemu的訊息是以TB(translate block)為單位在倒,也就是轉換成x86的指令的時候顯示,且轉換過一次就不會重新顯示,作為答案時會有許多不便,為此我們可以這樣設定
-d "exec,nochain -singlestep"
這樣能強迫QEMU逐行的轉換指令,進而讓我們得到指令層級的紀錄了,缺點是執行速度會慢上許多許多。
碎碎念 : 今天講QEMU,QEMU是筆者比較不熟悉的工具 (相較Spike和Gem5都有拆開來玩過),不過還是分享一些使用上的心得。QEMU的執行速度很快且功能強大,如果讀者對模擬有興趣強烈建議可以好好研究研究。